/**
 * C++ 提供了“仅调用一次”的功能
 * 要先声明一个 once_flag 类型的变量，最好是静态、全局的（线程可见），作为初始化的标志
 * 这样 C++ 就会保证，即使多个线程重入 call_once()，也只能有一个线程会成功运行初始化
 * 
 */

#include <iostream>
#include <mutex>
#include <vector>
#include <thread>

static std::once_flag flag;
int main()
{
    auto f = []() { 
        std::call_once (flag, [](){
            std::cout << "Hello, World!" << std::endl;
        });
    };

    std::vector<std::thread> threads;
    for(int i = 0; i < 5; i++){
        threads.emplace_back(f);
    }
    for (auto&it : threads)
    {
        it.join();
    }
    
}